package com.adee.jdk8;

public class Test005_InterfaceDefault {
    public static void main(String[] args) {
        // test1();
        test2();
    }

    public static void test1() {
        MyInterface1 m1 = new MyClass();
        m1.myMethod("aaa");
        MyInterface1 m2 = new MyClass();
        m2.myMethod("aaa");
        MyInterface1 m3 = new MyClass();
        m3.myMethod("aaa");
        MyInterface1 m4 = new MyClass();
        m4.myMethod("aaa");
    }

    public static void test2() {
        MyInterface3 m3 = new MyClass2();
        m3.myMethod("bbb"); // default in MyInterface3
        MyInterface5 m5 = new MyClass2();
        m5.myMethod("bbb"); // default in MyInterface3
    }
}

// 一个类实现了多个接口，多个接口中有相同方法，实现类中只实现一次该方法即可
class MyClass implements MyInterface1, MyInterface2, MyInterface3, MyInterface4 {

    @Override
    public void myMethod(String s) {
        MyInterface3.super.myMethod(s); // 调用接口中的default方法写法：接口名.super.方法
        System.out.println(s);
    }
}

// 当一个类的父类和接口有相同方法时，子类优先调用实现类中的方法，这是java规范所要求的，实现类方法比接口方法优先级高
class MyClass2 extends MyClass implements MyInterface5 {

}

interface MyInterface1 {
    void myMethod(String s);
}

interface MyInterface2 {
    void myMethod(String s);
}

// jdk1.8中，引入接口default方法的主要目的是实现jdk先后兼容
interface MyInterface3 {
    default void myMethod(String s) {
        System.out.println("default in MyInterface3");
    }
}

interface MyInterface4 {
    default void myMethod(String s) {
        System.out.println("default in MyInterface4");
    }
}

interface MyInterface5 {
    default void myMethod(String s) {
        System.out.println("default in MyInterface5");
    }
}



